# OneToManyEntityOptionsSupport.java

    package org.codefilarete.stalactite.engine.configurer.entity;

    import java.util.Collection;
    import java.util.function.Supplier;

    import org.codefilarete.reflection.SerializablePropertyAccessor;
    import org.codefilarete.reflection.SerializablePropertyMutator;
    import org.codefilarete.stalactite.dsl.entity.FluentMappingBuilderOneToManyJoinTableOptions;
    import org.codefilarete.stalactite.dsl.entity.FluentMappingBuilderOneToManyOptions;
    import org.codefilarete.stalactite.dsl.relation.OneToManyEntityOptions;
    import org.codefilarete.stalactite.engine.configurer.onetomany.OneToManyRelation;
    import org.codefilarete.stalactite.sql.ddl.structure.Column;

    /**
     * A small class for one-to-many options storage into a {@link OneToManyEntityOptions}. Acts as a wrapper over it.
     */
    public class OneToManyEntityOptionsSupport<C, I, O, S extends Collection<O>, O_ID>
    		implements OneToManyEntityOptions<C, I, O, S> {

    	private final OneToManyRelation<C, O, O_ID, S> oneToManyRelation;

    	public OneToManyEntityOptionsSupport(OneToManyRelation<C, O, O_ID, S> oneToManyRelation) {
    		this.oneToManyRelation = oneToManyRelation;
    	}

    	@Override
    	public FluentMappingBuilderOneToManyOptions<C, I, O, S> mappedBy(SerializablePropertyMutator<O, ? super C> reverseLink) {
    		oneToManyRelation.setReverseSetter(reverseLink);
    		return null;    // we can return null because dispatcher will return proxy
    	}

    	@Override
    	public FluentMappingBuilderOneToManyOptions<C, I, O, S> mappedBy(SerializablePropertyAccessor<O, ? super C> reverseLink) {
    		oneToManyRelation.setReverseGetter(reverseLink);
    		return null;    // we can return null because dispatcher will return proxy
    	}

    	@Override
    	public FluentMappingBuilderOneToManyOptions<C, I, O, S> mappedBy(Column<?, I> reverseLink) {
    		oneToManyRelation.setReverseColumn(reverseLink);
    		return null;    // we can return null because dispatcher will return proxy
    	}

    	@Override
    	public FluentMappingBuilderOneToManyOptions<C, I, O, S> reverseJoinColumn(String reverseColumnName) {
    		oneToManyRelation.setReverseColumn(reverseColumnName);
    		return null;
    	}

    	@Override
    	public FluentMappingBuilderOneToManyJoinTableOptions<C, I, O, S> joinTable(String tableName) {
    		oneToManyRelation.setAssociationTableName(tableName);
    		return null;
    	}

    	@Override
    	public FluentMappingBuilderOneToManyOptions<C, I, O, S> reverselySetBy(SerializablePropertyMutator<O, C> reverseLink) {
    		oneToManyRelation.setReverseLink(reverseLink);
    		return null;    // we can return null because dispatcher will return proxy
    	}

    	@Override
    	public FluentMappingBuilderOneToManyOptions<C, I, O, S> initializeWith(Supplier<S> collectionFactory) {
    		oneToManyRelation.setCollectionFactory(collectionFactory);
    		return null;    // we can return null because dispatcher will return proxy
    	}

    	@Override
    	public FluentMappingBuilderOneToManyOptions<C, I, O, S> cascading(RelationMode relationMode) {
    		oneToManyRelation.setRelationMode(relationMode);
    		return null;    // we can return null because dispatcher will return proxy
    	}

    	@Override
    	public FluentMappingBuilderOneToManyOptions<C, I, O, S> fetchSeparately() {
    		oneToManyRelation.fetchSeparately();
    		return null;    // we can return null because dispatcher will return proxy
    	}

    	@Override
    	public FluentMappingBuilderOneToManyOptions<C, I, O, S> indexedBy(Column<?, Integer> orderingColumn) {
    		oneToManyRelation.setIndexingColumn(orderingColumn);
    		return null;
    	}

    	@Override
    	public FluentMappingBuilderOneToManyOptions<C, I, O, S> indexedBy(String columnName) {
    		oneToManyRelation.setIndexingColumnName(columnName);
    		return null;
    	}

    	@Override
    	public FluentMappingBuilderOneToManyOptions<C, I, O, S> indexed() {
    		oneToManyRelation.ordered();
    		return null;
    	}
    }